package com.tianji.learning.service;

import com.tianji.common.domain.dto.PageDTO;
import com.tianji.learning.domain.dto.ReplyDTO;
import com.tianji.learning.domain.po.InteractionReply;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tianji.learning.domain.query.ReplyPageQuery;
import com.tianji.learning.domain.vo.ReplyVO;

/**
 * <p>
 * 互动问题的回答或评论 服务类
 * </p>
 *
 * @author zr
 * @since 2024-07-16
 */
public interface IInteractionReplyService extends IService<InteractionReply> {

    /**
     * 保存回复信息。
     * <p>
     * 该方法用于将回复数据对象（ReplyDTO）保存到数据库。
     * 通过此方法，可以持久化用户的回复，以便后续查看或处理。
     *
     * @param replyDTO 回复数据传输对象，包含了需要保存的回复的具体信息。
     *                 ReplyDTO应包含所有必要的字段，如回复内容、回复者信息等，
     *                 以便能够完整地保存回复的上下文。
     */
    void saveReply(ReplyDTO replyDTO);

    /**
     * 查询回复的分页信息。
     * <p>
     * 本函数旨在根据提供的查询条件和分页参数，从数据库中检索回复信息的分页数据。
     * 它返回一个包含回复数据和分页信息的数据传输对象（DTO）。
     *
     * @param pageQuery 包含分页和过滤条件的查询对象。
     *                  例如，它可以指定页码、每页数量，以及可能的过滤条件如回复的内容或创建时间范围。
     * @param b         一个布尔值参数，目前未使用，预留以供将来可能的扩展使用。
     *                  在当前实现中，此参数对查询行为没有影响。
     * @return PageDTO<ReplyVO> 返回一个封装了回复数据和分页信息的数据传输对象。
     * PageDTO 包含回复对象的列表以及分页信息，如总页数、当前页码和每页的项数。
     */
    PageDTO<ReplyVO> queryReplyPage(ReplyPageQuery pageQuery, boolean b);

    /**
     * 修改回复的隐藏状态。
     * <p>
     * 此方法用于更新数据库中某个回复的隐藏状态。通过指定回复的ID和新的隐藏状态，
     * 可以实现对回复可见性的控制。如果隐藏状态设置为true，则该回复将对普通用户不可见，
     * 只有管理员或特定用户组才能查看。
     *
     * @param id     回复的唯一标识符。这个ID用于在数据库中定位到特定的回复记录。
     * @param hidden 指定新的隐藏状态。如果为true，则将回复设置为隐藏；如果为false，则回复将变为可见。
     */
    void hiddenReply(Long id, Boolean hidden);

    /**
     * 根据回复ID查询回复信息。
     *
     * @param id 回复的唯一标识ID。
     * @return 返回查询到的回复信息，如果未找到则返回null。
     */
    ReplyVO queryReplyById(Long id);
}
